public class Leetcode {
}

//leetcode:413:等差数列划分
class Solution1 {
    public int numberOfArithmeticSlices(int[] nums) {
        int n = nums.length;

        //设立一个dp表对应的值代表的是以对应位置为结尾的等差数列的个数
        int[] dp = new int[n];

        int ret = 0;
        //由于至少要有3个元素，因此我们从下标为2的地方开始找等差数列
        for(int i = 2; i < n; i++){
            //如果相邻元素差相同，那么他就等差数列，所以此时位置等差数列的个数就为前一个位置的等差数列个数加一
            if(nums[i-1] - nums[i-2] == nums[i] - nums[i-1]){
                dp[i] = dp[i-1]+1;
            }
            //记录所有等等差数列个数
            ret += dp[i];
        }
        return ret;
    }
}


//leetcode:978:最长湍流子数组
class Solution2 {
    //如果为想要为湍流子数组那么他们的值必须为先上升后下降不断循环或先下降后上升不断循环的
    public int maxTurbulenceSize(int[] arr) {
        int n = arr.length;

        //设立两表f,g分别代表上升和下降
        int[] f = new int[n];
        int[] g = new int[n];

        //如果我们整个数组呈现平稳，那么我们就认为单个元素也为湍流子数组，此时长度为1，所以我们将表中的值全部初始化为1
        for(int i = 0; i < n ;i++){
            f[i] = g[i] = 1;
        }

        int ret = 1;
        for(int i = 1; i < n; i++){
            //如果此时呈现上升趋势，此时前一个就为下降，那么此时的长度就为前一个下降趋势加一
            if(arr[i] > arr[i-1]) f[i] = g[i-1] + 1;
            //如果此时呈现下降趋势，此时前一个就为上升，那么此时的长度就为前一个上升趋势加一
            if(arr[i] < arr[i-1]) g[i] = f[i-1] + 1;
            //得到所有位置长度的最大值
            ret = Math.max(ret , Math.max(f[i] , g[i]));
        }
        return ret;
    }
}